﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CasaBella.Entities;
using System.Data.Objects;
using System.Data;

namespace CasaBella.Repository
{
    public class ClienteNaturalRepository:MasterRepository,IClienteNaturalRepository
    {
        public List<CLIENTE_NATURAL> GetAllFromClienteNatural()
        {
            var query = from c in context.CLIENTE_NATURAL.Include("CLIENTE")
                        where c.ClienteNaturalId.Equals(c.CLIENTE.Codigo)
                        select c;
            return query.ToList();
        }

        public List<CLIENTE_NATURAL> GetAllFromClienteNaturalByCriterio(string criterio)
        {
            var query = from e in context.CLIENTE_NATURAL.Include("CLIENTE")
                        select e;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from e in context.CLIENTE_NATURAL.Include("CLIENTE")
                        where e.Dni.Contains(criterio) ||
                                   e.ApPaterno.ToUpper().Contains(criterio) ||
                                   e.ApMaterno.ToUpper().Contains(criterio) ||
                                   e.Nombre.ToUpper().Contains(criterio)
                        select e;
            }
            return query.ToList();
        }

        public CLIENTE_NATURAL GetAllFromClienteNaturalByDni(string dni)
        {
            var query = from c in context.CLIENTE_NATURAL.Include("CLIENTE")
                        where c.Dni.CompareTo(dni) == 0
                        select c;
            return query.SingleOrDefault();
        }

        public void AddClienteNatural(CLIENTE_NATURAL cliNatural)
        {
            //guardando TELEFONOS DEL CLIENTE
            foreach (var item in cliNatural.CLIENTE.TELEFONOS_CLIENTE)
            {
                item.OPERADOR = null;
                item.CLIENTE = null;
                context.Entry(item).State = EntityState.Added;
            }
            cliNatural.CLIENTE.CLIENTE_JURIDICO = null;
            cliNatural.CLIENTE.CLIENTE_NATURAL = null;

            context.CLIENTE_NATURAL.Add(cliNatural);
            context.SaveChanges();
        }

        public void UpdateClienteNatural(CLIENTE_NATURAL cliNatural)
        {
            var clienteNaturalDB = (from c in context.CLIENTE_NATURAL.Include("CLIENTE")
                                    where c.Id.Equals(cliNatural.Id)
                                    select c).SingleOrDefault();

            clienteNaturalDB.ApMaterno = cliNatural.ApMaterno;
            clienteNaturalDB.ApPaterno = cliNatural.ApPaterno;
            clienteNaturalDB.Nombre = cliNatural.Nombre;
            clienteNaturalDB.Dni = cliNatural.Dni;
            clienteNaturalDB.CLIENTE.Comentario = cliNatural.CLIENTE.Comentario;
            clienteNaturalDB.CLIENTE.Direccion = cliNatural.CLIENTE.Direccion;
            clienteNaturalDB.CLIENTE.Email = cliNatural.CLIENTE.Email;

            //editando los TELEFONOS DEL CLIENTE
            foreach (var item in cliNatural.CLIENTE.TELEFONOS_CLIENTE)
            {
                item.OPERADOR = null;
                item.CLIENTE = null;
                if (item.Id.Equals(0))
                {
                    item.CLIENTE = clienteNaturalDB.CLIENTE;
                    item.OPERADOR = context.OPERADORs.Find(item.IdOperador);
                    context.Entry(item).State = EntityState.Added;
                    clienteNaturalDB.CLIENTE.TELEFONOS_CLIENTE.Add(item);
                }
                else
                {
                    context.TELEFONOS_CLIENTE.Attach(item);
                    context.Entry(item).State = System.Data.EntityState.Modified;
                    item.CLIENTE = null;
                }
            }
            context.Entry(clienteNaturalDB.CLIENTE).State = EntityState.Modified;
            context.Entry(clienteNaturalDB).State = EntityState.Modified;
            context.SaveChanges();
        }
    }
}
